﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using Entidades.Seguridad;
using Entidades.Sistema;


namespace Vista.Sistema
{
    public partial class FormGestionarOrden : Form
    {

        BindingSource bsOrdenProduccion;
        ReadOnlyCollection<Entidades.Sistema.OrdenProduccion> colOrdenProduccion;

        
        private Entidades.Seguridad.Usuario _Usuario;
        private ReadOnlyCollection<Entidades.Seguridad.Perfil> _Perfiles;
        private static FormGestionarOrden instancia;
        
        private Entidades.Sistema.Producto oProd;
        private Entidades.Sistema.OrdenProduccion selOrden;

        private DataGridViewTextBoxColumn ColumnCodOrden = new DataGridViewTextBoxColumn();
        private DataGridViewTextBoxColumn ColumnProducto = new DataGridViewTextBoxColumn();
        private DataGridViewTextBoxColumn ColumnEstado = new DataGridViewTextBoxColumn();
        private DataGridViewTextBoxColumn ColumnCapTotal = new DataGridViewTextBoxColumn();

        public static FormGestionarOrden obtener_instancia(Entidades.Seguridad.Usuario oUsuario)
        {
            if (instancia == null)
                instancia = new FormGestionarOrden(oUsuario);
            if (instancia.IsDisposed)
                instancia = new FormGestionarOrden(oUsuario);

            return instancia;
        }

        public FormGestionarOrden(Entidades.Seguridad.Usuario oUsuario)
        {
            InitializeComponent();
            _Usuario = new Entidades.Seguridad.Usuario();
            _Usuario = oUsuario;

            _Perfiles = Controladora.Seguridad.CUIniciarSesion.ObtenerInstancia().RecuperarPerfilesGrupos(_Usuario);

            this.CenterToScreen();

            foreach (Entidades.Seguridad.Perfil perfil in _Perfiles)
            {
                if (this.Text == perfil.Formulario.Nombre)
                {
                    foreach (Control control in this.Controls)
                    {
                        if (control is Button)
                        {
                            Button boton = (Button) control;

                            if (perfil.Permiso.Nombre == boton.Text) boton.Enabled = true;
                        }
                    }
                }
            }

            ColumnCodOrden.DataPropertyName = "cod_orden";
            ColumnCodOrden.HeaderText = "N° ORDEN";
            ColumnProducto.DataPropertyName = "NombreProducto";
            ColumnProducto.HeaderText = "PRODUCTO";
            ColumnEstado.DataPropertyName = "Estado";
            ColumnEstado.HeaderText = "ESTADO";
            ColumnCapTotal.DataPropertyName = "cap_total";
            ColumnCapTotal.HeaderText = "CAP. TOTAL";

            dgvProd.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
                ColumnCodOrden, ColumnProducto, ColumnEstado,ColumnCapTotal });

        }

        private void FormGestionarOrden_Load(object sender, EventArgs e)
        {
            this.armargrilla();
            cmbEstado.DataSource = cargacmbEstadoOrden();
            cmbEstado.DisplayMember = "ESTADO";
            cmbEstado.ValueMember = "CODIGO";
        }

        private void armargrilla()
        {
            bsOrdenProduccion = new BindingSource();
            colOrdenProduccion = Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().ConsultarOrdenProduccion();
            bsOrdenProduccion.DataSource = colOrdenProduccion;

            bsOrdenProduccion.Sort = "cod_orden";
            dgvProd.DataSource = bsOrdenProduccion;

            selOrden = new Entidades.Sistema.OrdenProduccion();
            selOrden = (Entidades.Sistema.OrdenProduccion)bsOrdenProduccion.Current;

            // Revisar y encontrar la forma de hacerlo por medio de metos
            switch (selOrden.stateOrden.DevolverEstado())
            {
                case "Creada":
                    btnInterrumpir.Text = "Interrumpir";
                    break;
                case "Cancelada":
                    break;
                case "Iniciada":
                    btnmodificar.Enabled = false;
                    break;
                case "Interrumpida":
                    btnInterrumpir.Text = "Activar";
                    break;
                case "Finalizada":
                    btnInterrumpir.Enabled = false;
                    break;
            }

            dgvProd.Columns["producto"].Visible = false;
            dgvProd.Columns["reservaMateriaPrima"].Visible = false;
            dgvProd.Columns["auditoria"].Visible = false;
            dgvProd.Columns["stateOrden"].Visible = false;

            cargaComboProductos();
        }

        private void dgvProd_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            selOrden = new Entidades.Sistema.OrdenProduccion();
            selOrden = (Entidades.Sistema.OrdenProduccion)bsOrdenProduccion.Current;

            // Revisar y encontrar la forma de hacerlo por medio de metos
            switch (selOrden.stateOrden.DevolverEstado())
            {
                case "Creada":
                    btnInterrumpir.Text = "Interrumpir";
                    break;
                case "Cancelada":
                    break;
                case "Iniciada":
                    btnmodificar.Enabled = false;
                    break;
                case "Interrumpida":
                    btnInterrumpir.Text = "Activar";
                    break;
                case "Finalizada":
                    btnInterrumpir.Enabled = false;
                    break;
            }
        }

        private void btnInterrumpir_Click(object sender, EventArgs e)
        {
            
            DialogResult drInterrumpir = MessageBox.Show("¿Confirma la interrumpción de la Orden: " + dgvProd.CurrentRow.Cells[0].Value.ToString() + "?", "Interrumpir Orden", MessageBoxButtons.YesNo);

            if (bsOrdenProduccion.Count == 0)
            {
                MessageBox.Show("No hay Orden para Interrumpir");
            }
            else if (drInterrumpir == System.Windows.Forms.DialogResult.Yes)
            {
                selOrden = (Entidades.Sistema.OrdenProduccion) bsOrdenProduccion.Current;


                //Hacer switch
                if (selOrden.stateOrden.DevolverEstado() == "Interrumpida")
                {
                    selOrden.stateOrden.EstadoCreada(selOrden);
                    selOrden.stateOrden.EnviarMail();
                }
                else
                {
                    selOrden.stateOrden.EstadoInterrumpida(selOrden);
                    selOrden.stateOrden.EnviarMail();
                }

                Entidades.Sistema.Auditoria oAuditoria = new Entidades.Sistema.Auditoria();

                oAuditoria.USUARIO = _Usuario;
                oAuditoria.FechaModificacion = DateTime.Now;
                oAuditoria.TipoOperacion = AuditoriaTipoOperacion.Modificacion;

                selOrden.auditoria = oAuditoria;

                bool ret = Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().InterrumpirOrden(selOrden);

                armargrilla();
            }
        }

        private void btncerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnagregar_Click(object sender, EventArgs e)
        {
            Vista.Sistema.FormRegistrarOrden oFrm = new FormRegistrarOrden("Alta",_Usuario);
            oFrm.ShowDialog();
            this.armargrilla();
        }

        private void btnmodificar_Click(object sender, EventArgs e)
        {
            if (bsOrdenProduccion.Count == 0)
            {
                MessageBox.Show("No Hay Orden de Produccion a Modificar");
            }
            else
            {
                Vista.Sistema.FormRegistrarOrden oFrm = new FormRegistrarOrden("Modificar",_Usuario,(Entidades.Sistema.OrdenProduccion)bsOrdenProduccion.Current);
                oFrm.ShowDialog();
                this.armargrilla();
            }
        }

        private void btneliminar_Click(object sender, EventArgs e)
        {
            DialogResult dialogo;
            dialogo = MessageBox.Show("¿Esta seguro que desea eliminar la Orden?", "ADVERTENCIA", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            
            
            if (dialogo == System.Windows.Forms.DialogResult.Yes)
            {
                Entidades.Sistema.OrdenProduccion oOrd = new Entidades.Sistema.OrdenProduccion();

                oOrd = (Entidades.Sistema.OrdenProduccion) bsOrdenProduccion.Current;

                oOrd.auditoria.USUARIO = _Usuario;
                oOrd.auditoria.TipoOperacion = AuditoriaTipoOperacion.Baja;
                oOrd.auditoria.FechaModificacion = DateTime.Now;

                Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().EliminarOrden(oOrd);

                oOrd.stateOrden.EstadoCancelada(oOrd);
                oOrd.stateOrden.EnviarMail();

                this.armargrilla();
            }
        }


        private void cargaComboProductos()
        {
            //Cargamos el campo de Productos
            BindingList<Entidades.Sistema.Producto> bslProductos = new BindingList<Entidades.Sistema.Producto>();
            ReadOnlyCollection<Entidades.Sistema.Producto> colProductos;

            colProductos = Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().ConsultarProductos();

            oProd = new Entidades.Sistema.Producto();

            oProd.cod_producto = 0;
            oProd.nombre = "TODOS";
            bslProductos.Add(oProd);

            foreach (Entidades.Sistema.Producto oProducto in colProductos)
            {
                bslProductos.Add(oProducto);
            }

            cmbProductos.DataSource = bslProductos;
            this.cmbProductos.DisplayMember = "nombre";
        }

        public DataTable cargacmbEstadoOrden()
        {
            //cambiar luego de aplicar el patron estate
            
            System.Data.DataTable dtESTADOS = new System.Data.DataTable();
            System.Data.DataColumn dtcESTADO = new System.Data.DataColumn("CODIGO", typeof(String));
            dtESTADOS.Columns.Add(dtcESTADO);
            dtcESTADO = new System.Data.DataColumn("ESTADO", typeof(String));
            dtESTADOS.Columns.Add(dtcESTADO);
            System.Data.DataRow drESTADO = dtESTADOS.NewRow();

            drESTADO = dtESTADOS.NewRow();
            drESTADO["CODIGO"] = "T";
            drESTADO["ESTADO"] = "TODOS";
            dtESTADOS.Rows.Add(drESTADO);


            drESTADO = dtESTADOS.NewRow();
            drESTADO["CODIGO"] = "A";
            drESTADO["ESTADO"] = "Creada";
            dtESTADOS.Rows.Add(drESTADO);

            drESTADO = dtESTADOS.NewRow();
            drESTADO["CODIGO"] = "I";
            drESTADO["ESTADO"] = "Interrumpida";
            dtESTADOS.Rows.Add(drESTADO);

            drESTADO = dtESTADOS.NewRow();
            drESTADO["CODIGO"] = "F";
            drESTADO["ESTADO"] = "Finalizada";
            dtESTADOS.Rows.Add(drESTADO);

            drESTADO = dtESTADOS.NewRow();
            drESTADO["CODIGO"] = "C";
            drESTADO["ESTADO"] = "Iniciada";
            dtESTADOS.Rows.Add(drESTADO);

            return dtESTADOS;
        }

        private void btnfiltrar_Click(object sender, EventArgs e)
        {
            Entidades.Sistema.Producto oProducto = new Producto();
            int cod_orden = 0;


            if (this.txtCodOrden.Text.Trim() != "")
            {
                cod_orden = Convert.ToInt32(txtCodOrden.Text);
            }
            
            oProducto = (Entidades.Sistema.Producto)cmbProductos.SelectedItem;
            string estado = cmbEstado.SelectedItem.ToString();

            colOrdenProduccion =
                Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().ConsultarOrdenProduccion(
                    cod_orden,estado, dateFechaInicio.Value, oProducto);

            bsOrdenProduccion.DataSource = colOrdenProduccion;
            dgvProd.DataSource = bsOrdenProduccion;
        }
    }
}
